<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    class Person {
      constructor(name, sex) {
        this.name = name
        this.sex = sex
        this.say = function () {
          console.log('say');
        }
      }
      speak(){
        console.log('person speak');
        console.log(this);
      }
      static speak(){
        console.log('person static speak');
        console.log(this);
      }
    }
    class Programmer extends Person{
      //1.作为函数调用 代表父类的构造方法，只能在子类的构造方法中，用在其他地方就会报错
      //在构造方法中使用，super代表父类的原型对象 Person.prototype
      //定义在父类实例上的方法或属性，是无法通过super调用的
      constructor(name,sex,feature){
        //this操作不能放在super前面
        super(name,sex)
        this.feature=feature
        // console.log(super.name);
        // super.speak()
      }
      //通过super调用父类的方法时，方法内部的this指向当前子类实例
      speak(){
        super.speak()
        console.log('Programmer speak');
      }
      //在静态方法中使用
      //指向父类，而不是父类的原型对象
      //通过super调用父类的方法时，方法内部的this指向当前的子类而不是子类的实例
      static speak(){
        super.speak()
        console.log('Programmer static speak');
      }
    }
    //使用super时候，必须显示指定是作为函数还是对象使用，否则会报错
    const p=new Programmer()
    p.speak()
    Programmer.speak()
  </script>
</body>

</html>